package thread.unit4.learn;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 *
 * 创建线程的方式三：实现Callable接口 ---JDK5.0新增
 *
 * 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大？
 * 1. call()可以有返回值的。
 * 2. call()可以抛出异常，被外面的操作捕获，获取异常的信息
 * 3. Callable是支持泛型的
 *
 */

//第一步：子线程类需要实现Callable接口
class ChildThread implements Callable{
    //第二步：重写call方法
    @Override
    public Object call() throws Exception {
        //用子线程打印0-100的偶数 并求和
        int sum = 0;
        for (int i = 0; i < 100; i++) {
            if(i%2==0){
                System.out.println(i);
                sum+=i;
            }
        }
        return sum;
    }
}

public class ThreadCreate3 {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //第三步：创建子线程类对象
        ChildThread childThread = new ChildThread();
        //第四步：创建FutureTask类对象 并将Callable的实现类对象作为参数传入
        FutureTask futureTask = new FutureTask(childThread);
        //第五步：创建Thread类对象 并将FutureTask类对象传入 此时可以用start()方法运行子线程
        Thread t1 = new Thread(futureTask);
        t1.start();

        //第六步：通过FutureTask的get()方法，可以拿到call()的返回值
        //要拿到子线程call()方法返回值的前提 必须要先让该子线程类start()跑起来
        Object sum = futureTask.get();
        System.out.println("0-100之内偶数和："+sum);
    }
}


